package 微服务.SpringCloud_1.Ribbon_2.负载均衡原理;

/**
 * 负载均衡原理
 */
public class index {
    /**
     * 在项目cloud-demo中，我们在远程调用时使用了服务名去代替地址和端口<p>
     * 而实际上浏览器并不能访问到这个地址（userservice/user/1）<p>
     * 这就说明，在orderservice和userservice之间，一定还存在一个组件，来实现请求的转发<p>
     * 这个组件就是Ribbon<p></p>
     * <p>
     * 首先Ribbon拦截到请求后，需要知道需要被调用的是哪个服务<p>
     * 知道了之后Ribbon就会从Eureka-server里拉取服务<p>
     * eureka-server就会返回服务列表给Ribbon<p>
     * 当Ribbon拿到服务列表之后，下一步就可以对列表里的服务做负载均衡（默认策略是轮询）<p></p>
     * <p>
     * 负载均衡有一个类参与其中：<a href="">LoadBalancerInterceptor</a><p>
     * 这个类实现了接口<a href="">ClientHttpRequestInterceptor</a><p>
     * ClientHttpRequestInterceptor是一个客户端http请求拦截器<p>
     * 由于我们demo中使用的是<a href="">RestTemplate</a>，它就是一个发http请求的客户端<p>
     * 所以它发出的请求就会被拦截下来<p>
     * ClientHttpRequestInterceptor中有一个方法被LoadBalancerInterceptor实现：<a href="">intercept()</a><p>
     * 在这个方法里，就会获得服务名称（通过getHost()），然后交给loadBalancer对象去完成服务列表的拉取，之后再使用IRule对象实现负载均衡，挑选出一个服务<p></p>
     * <p>
     * 详见源码和图片"Ribbon负载均衡流程.png"<p>
     *
     * @param args
     */
    public static void main(String[] args) {

    }
}
